package com.stellar.core.util;

import java.text.SimpleDateFormat;
import java.util.TimeZone;

/**
 * 日期时间格式化常量类
 * <p>
 * 该类提供了常用的日期和时间格式化字符串，方便在项目中统一管理和使用。
 * 所有常量均为public static final，确保线程安全和不可变性。
 * 提供了工具方法用于获取SimpleDateFormat实例，避免直接创建导致的线程安全问题。
 */
public class DateFormatConstants {

    // ------------------ 日期格式化常量 ------------------

    /**
     * 标准日期格式：yyyy-MM-dd
     * <p>
     * 示例：2025-02-19
     * <p>
     */
    public static final String DATE_FORMAT_YYYY_MM_DD = "yyyy-MM-dd";

    /**
     * 简洁日期格式：yyyyMMdd
     * <p>
     * 示例：20250219
     * <p>
     */
    public static final String DATE_FORMAT_YYYYMMDD = "yyyyMMdd";

    /**
     * 简化日期格式：yyyy-M-d
     * <p>
     * 示例：2025-2-19
     * <p>
     */
    public static final String DATE_FORMAT_YYYY_M_D = "yyyy-M-d";

    // ------------------ 时间格式化常量 ------------------

    /**
     * 标准时间格式：HH:mm:ss
     * <p>
     * 示例：14:30:00
     * <p>
     */
    public static final String TIME_FORMAT_HH_MM_SS = "HH:mm:ss";

    /**
     * 简洁时间格式：HHmmss
     * <p>
     * 示例：143000
     * <p>
     */
    public static final String TIME_FORMAT_HHMMSS = "HHmmss";

    // ------------------ 日期时间格式化常量 ------------------

    /**
     * 标准日期时间格式：yyyy-MM-dd HH:mm:ss
     * <p>
     * 示例：2025-02-19 14:30:00
     * <p>
     */
    public static final String DATETIME_FORMAT_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    /**
     * 简洁日期时间格式：yyyyMMddHHmmss
     * <p>
     * 示例：20250219143000
     * <p>
     */
    public static final String DATETIME_FORMAT_YYYYMMDD_HHMMSS = "yyyyMMddHHmmss";

    // ------------------ ISO格式化常量 ------------------

    /**
     * ISO日期格式：yyyy-MM-dd
     * <p>
     * 示例：2025-02-19
     * <p>
     */
    public static final String ISO_DATE_FORMAT = "yyyy-MM-dd";

    /**
     * ISO时间格式：HH:mm:ss
     * <p>
     * 示例：14:30:00
     * <p>
     * 符合ISO 8601标准，适用于国际化场景。
     */
    public static final String ISO_TIME_FORMAT = "HH:mm:ss";

    /**
     * ISO日期时间格式：yyyy-MM-dd'T'HH:mm:ss
     * <p>
     * 示例：2025-02-19T14:30:00
     * <p>
     * 符合ISO 8601标准，适用于国际化场景，用于JSON、XML等数据交换格式。
     */
    public static final String ISO_DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";

    // ------------------ 本地化格式化常量 ------------------

    /**
     * 本地化日期格式：yyyy年MM月dd日
     * <p>
     * 示例：2025年02月19日
     * <p>
     * 适用于中文环境下的日期显示。
     */
    public static final String DATE_FORMAT_YYYY年MM月DD日 = "yyyy年MM月dd日";

    /**
     * 本地化时间格式：HH时mm分ss秒
     * <p>
     * 示例：14时30分00秒
     * <p>
     * 适用于中文环境下的时间显示。
     */
    public static final String TIME_FORMAT_HH时MM分SS秒 = "HH时mm分ss秒";

    // ------------------ 时区常量 ------------------

    /**
     * 常用时区：格林威治时间（GMT）
     */
    public static final String TIME_ZONE_GMT = "GMT";

    /**
     * 常用时区：格林威治时间+8（北京时间）
     */
    public static final String TIME_ZONE_GMT_PLUS_8 = "GMT+8";

    /**
     * 常用时区：协调世界时（UTC）
     */
    public static final String TIME_ZONE_UTC = "UTC";

    /**
     * 常用时区：美国东部标准时间（EST）
     */
    public static final String TIME_ZONE_EST = "EST";

    /**
     * 常用时区：美国中部标准时间（CST）
     */
    public static final String TIME_ZONE_CST = "CST";

    /**
     * 常用时区：美国太平洋标准时间（PST）
     */
    public static final String TIME_ZONE_PST = "PST";


    // ------------------ 工具方法 ------------------

    /**
     * 获取SimpleDateFormat实例
     * <p>
     * 由于SimpleDateFormat不是线程安全的，建议通过此方法获取实例，
     * 避免直接创建导致的线程安全问题。
     *
     * @param pattern 日期时间格式化字符串
     * @return SimpleDateFormat实例
     */
    public static SimpleDateFormat getSimpleDateFormat(String pattern) {
        return new SimpleDateFormat(pattern);
    }

    /**
     * 获取带时区的SimpleDateFormat实例
     * <p>
     * 用于需要指定时区的日期时间格式化。
     *
     * @param pattern    日期时间格式化字符串
     * @param timeZoneId 时区ID（如"GMT+8"）
     * @return SimpleDateFormat实例
     */
    public static SimpleDateFormat getSimpleDateFormatWithTimeZone(String pattern, String timeZoneId) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
        dateFormat.setTimeZone(TimeZone.getTimeZone(timeZoneId));
        return dateFormat;
    }

    /**
     * 私有构造方法，防止类被实例化
     * <p>
     * 该类仅作为工具类使用，不应被实例化。
     */
    private DateFormatConstants() {
        throw new UnsupportedOperationException("私有工具类，不能实例化");
    }
}